let layerIndex;
let $;
var toast;

/**
 * 弹出成绩新增/编辑对话框
 * 有id编辑，无id新增
 */
function showScoreDlg(id) {
    let title = "新增成绩";
    if (id) {
        // 是编辑
        title = "编辑成绩";
        $("#formId").css("display", "block");

        // 读取成绩信息，并赋值
        $.ajax({
            url: "/api/score/" + id,
            method: "GET"
        }).done(result => {
            console.log(result);

            if(result.code >= 0) {
                let data = result.data;

                // 遍历result对象并将值填充到 #studForm 表单
                $.each(result.data, function (key, value) {
                    var field = $('#studForm [name="' + key + '"]');
                    field.val(value);
                });
                // 再次渲染表单，确保UI更新
                layui.form.render();
            } else {
                // 出错了
                toast.error({
                    message: result.msg,
                });
            }
        });
    } else {
        // 新增
        $("#studForm")[0].reset(); // 清空表单内容
        $("#formId").css("display", "none"); // 新增时不显示id
    }

    layerIndex = layer.open({
        type: 1,
        title: title,
        area: ['520px', 'auto'],
        content: $('#popDlg')[0].innerHTML // 捕获层
    });
}

// 获取查询条件
function getSearchCondition() {
    let formData = {}; // 初始化一个空对象，用于存储表单数据

    // 遍历每个输入元素，将其值存储到 formData 对象中
    $('#queryForm').find('input, select').each(function () {
        let name = $(this).attr('name'); // 获取元素的 name 属性
        let value = $(this).val(); // 获取元素的值

        // 只有 name 属性存在且值不为空才会添加到 formData 中
        if (name && value) {
            formData[name] = value;
        }
    });

    console.log("请求数据:", formData); // 调试输出请求数据
    return formData; // 返回包含表单数据的对象
}

// 加载成绩列表
function loadScoreList() {
    const table = layui.table;
    let score = getSearchCondition();
    table.reloadData("tbStudent", {
        where: {data: score}
    });
}

layui.use(['form', 'table', 'layer'], function () {
    $ = layui.$;
    toast = layui.toast;
    const form = layui.form;
    const table = layui.table;
    const layer = layui.layer;

    // 验证表单是否合法
    form.on('submit(stud-dlg)', function (data) {
        event.preventDefault(); // 阻止表单默认提交

        // 防止重复提交表单的标记
        if (this.isSubmitting) return false;
        this.isSubmitting = true;

        commitScoreDlg()
            .catch(error => {
                console.error('提交失败', error);
            })
            .finally(() => {
                this.isSubmitting = false;
            });
        return false;
    });

    // 表格初始化
    let score = getSearchCondition(); // 获取查询条件

    // 创建layui渲染实例
    table.render({
        elem: '#tbStudent', // 指定表格容器的 ID
        url: '/api/score/getbypage', // 后端接口
        method: "POST",
        contentType: 'application/json', // 确保以 JSON 格式发送
        where: { data: score }, // 传递的数据
        page: true, // 支持分页
        cols: [[
            { type: 'checkbox', fixed: 'left' }, // 添加复选框列
            { field: 'id', fixed: 'left', width: 160, title: 'ID', sort: true },
            { field: 'sno', title: '学号', width: 200 },
            { field: 'sname', title: '学生姓名', width: 250 },
            { field: 'cname', title: '课程名称', width: 250 },
            { field: 'score', title: '分数', sort: true },
            // {
            //     fixed: 'right',
            //     title: '操作',  minWidth: 125, templet: '#editTemplate' // 操作列，使用自定义模板
            // }
        ]],
        done: function (rs) {
            console.log("表格渲染完成，返回数据:", rs);
            if (rs.data.length === 0) {
                layer.msg('没有找到相关数据');
            }
        },
        fail: function (rs, msg) {
            console.error("表格渲染失败:", msg);
            layer.msg('请求失败，请重试');
        }
    });

    // 触发单元格工具事件
    table.on('tool(tbStudent)', function (obj) {
        var data = obj.data; // 获取当前行数据
        console.log(obj);
        if (obj.event === 'edit') {
            showScoreDlg(data.id);  // 编辑时弹出已有数据的对话框
        } else if (obj.event === 'delete') {
            deleteScoreById(data.id);
        }
    });
});

// 查询
function search() {
    let score = getSearchCondition();
    const table = layui.table;
    table.reloadData("tbStudent", {
        where: { data: score }
    });
    console.log("where condition:" + JSON.stringify(score));
}

// 批量删除确认
function deleteConfirm() {
    const table = layui.table;
    // 获取表格的选中状态
    const checkStatus = table.checkStatus('tbStudent');

    if (checkStatus.data.length === 0) {
        layer.msg('请至少选择一条数据');
        return;
    }

    layer.confirm('确定删除选中的' + checkStatus.data.length + '条数据吗？', {icon: 3}, function(index) {
        const ids = checkStatus.data.map(item => item.id);

        $.ajax({
            url: "/api/score/deleteBatch",
            method: "POST",
            contentType: "application/json",
            data: JSON.stringify(ids),
            success: function(result) {
                if (result.code === 0) {
                    layer.msg('删除成功');
                    loadScoreList();
                } else {
                    layer.msg('删除失败: ' + result.msg);
                }
            },
            error: function() {
                layer.msg('删除失败');
            }
        });
        layer.close(index);
    });
}

// 提交成绩表单
function commitScoreDlg() {
    return new Promise((resolve, reject) => {
        $("#btnOK").prop("disabled", true).addClass("layui-btn-disabled");

        const id = $("#id").val();
        const formData = $(".layui-layer-page #studForm").serializeArray();
        const data = {};
        formData.forEach(item => {
            data[item.name] = item.value;
        });

        const url = id ? "/api/score/update" : "/api/score/add";
        const method = id ? "PUT" : "POST";

        $.ajax({
            url: url,
            method: method,
            contentType: 'application/json',
            data: JSON.stringify(data)
        }).done(result => {
            if (result.code === 0) {
                loadScoreList();
                if (layerIndex) layer.close(layerIndex);
                layer.msg(id ? '更新成功' : '添加成功');
                resolve(result);
            } else {
                const errorMsg = result.msg || (id ? "更新失败" : "添加失败");
                toast.error({ message: errorMsg });
                reject(new Error(errorMsg));
            }
        }).fail((jqXHR, textStatus, errorThrown) => {
            const errorMsg = `请求失败: ${textStatus} - ${errorThrown}`;
            console.error(errorMsg);
            toast.error({ message: "系统错误，请稍后重试" });
            reject(new Error(errorMsg));
        }).always(() => {
            $("#btnOK").prop("disabled", false).removeClass("layui-btn-disabled");
        });
    });
}

// 删除单个成绩
function deleteScoreById(id) {
    layer.confirm('你确定删除吗？一旦删除，不可恢复！', {icon: 3}, function() {
        $.ajax({
            url: "/api/score/delete/" + id,
            method: "DELETE",
            success: function(result) {
                if (result.code === 0) {
                    layer.msg('删除成功');
                    loadScoreList();
                } else {
                    layer.msg('删除失败: ' + result.msg);
                }
            },
            error: function() {
                layer.msg('删除失败');
            }
        });
    });
}